#include "Connection.h"

Connection::Connection(EventLoop *loop, Socket *clientsock)
    : loop_(loop), clientsock_(clientsock)
{
    ////////////////////////////////////////////////////////////////////////
    // 为新客户端连接准备读事件，并添加到epoll中。
    clientchannel_ = new Channel(loop_, clientsock_->fd()); // 这里new出来的对象没有释放，这个问题以后再解决。
    // 找到bug了这是是servchannel
    clientchannel_->setreadcallback(std::bind(&Channel::onmessage, clientchannel_));
    clientchannel_->setcloseCallBack(std::bind(&Connection::closecallback, this));
    clientchannel_->seterrorCallBack(std::bind(&Connection::errorcallback, this));
    clientchannel_->useet(); // 客户端连上来的fd采用边缘触发。
    clientchannel_->enablereading();
    // 让epoll_wait()监视clientchannel的读事件。
    ////////////////////////////////////////////////////////////////////////
}

Connection::~Connection()
{
    delete clientchannel_;
    delete clientsock_;
}

int Connection::fd() const
{
    return clientsock_->fd();
}
std::string Connection::getiP() const
{
    return clientsock_->getiP();
}
uint16_t Connection::getport() const
{
    return clientsock_->getport();
}

void Connection::closecallback() // TCP断开连接的回调函数 ，提供channel 回调
{
    printf("client(eventfd=%d) disconnected.\n", fd());
    close(fd()); // 关闭客户端的fd。
}
void Connection::errorcallback() // TcP连接错误的回调函数，提供Channel 回调
{
    printf("client(eventfd=%d) error.\n",  fd());
    close(fd()); // 关闭客户端的fd。
}